import numpy as np
import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

# 生成更接近0的x值范围
x_values = np.array([0.1, 0.05, 0.01, 0.005, 0.001, 0.0005, 0.0001])

print("等价无穷小验证 (x → 0)")
print("=" * 60)

# 验证所有常见的等价无穷小
equivalents = [
    ('sin(x) ~ x', lambda x: np.sin(x) / x),
    ('tan(x) ~ x', lambda x: np.tan(x) / x),
    ('arcsin(x) ~ x', lambda x: np.arcsin(x) / x),
    ('ln(1+x) ~ x', lambda x: np.log(1 + x) / x),
    ('e^x-1 ~ x', lambda x: (np.exp(x) - 1) / x),
    ('1-cos(x) ~ x²/2', lambda x: (1 - np.cos(x)) / (0.5 * x**2))
]

# 打印数值验证结果
for name, ratio_func in equivalents:
    print(f"\n{name}:")
    print("   x\t\t  比值")
    print("-" * 30)
    for x in x_values:
        try:
            ratio = ratio_func(x)
            print(f"   {x:.6f}\t  {ratio:.8f}")
        except:
            print(f"   {x:.6f}\t  计算错误")

# 可视化：使用更接近0的x范围
plt.figure(figsize=(12, 8))

# 生成用于绘图的x值（更小的范围，更接近0）
x_plot = np.logspace(-5, -1, 200)  # 从10^-5到10^-1

# 定义颜色和线型（与图片保持一致）
colors = ['blue', 'green', 'red', 'purple', 'orange', 'brown']
linestyles = ['-', '--', '-.', ':', '-', '--']
linewidths = [2, 2, 2, 2, 2, 2]

# 计算并绘制所有比值曲线
for i, (name, ratio_func) in enumerate(equivalents):
    ratio_values = []
    for x in x_plot:
        try:
            ratio_values.append(ratio_func(x))
        except:
            ratio_values.append(np.nan)
    
    ratio_values = np.array(ratio_values)
    plt.semilogx(x_plot, ratio_values, 
                color=colors[i], 
                linestyle=linestyles[i],
                linewidth=linewidths[i], 
                label=name.split('~')[0].strip())

# 添加参考线
plt.axhline(y=1, color='black', linestyle='--', alpha=0.7, label='y=1')

plt.xlabel('x (对数尺度)')
plt.ylabel('比值')
plt.title('常见等价无穷小验证: 比值趋近于 1 (x → 0)', fontsize=14)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid(True, alpha=0.3)

# 设置更精细的y轴范围，更好地显示趋近过程
plt.ylim(0.995, 1.005)

# 添加次要网格线
plt.minorticks_on()
plt.grid(True, which='minor', alpha=0.2)

plt.tight_layout()
plt.show()

# 在极小的x值下验证
print("\n" + "=" * 60)
print("在极小的 x 值下的比值验证:")
print("=" * 60)

tiny_x_values = [1e-3, 1e-4, 1e-5, 1e-6]
for x in tiny_x_values:
    print(f"\nx = {x:.0e}:")
    for name, ratio_func in equivalents:
        try:
            ratio = ratio_func(x)
            print(f"  {name.split('~')[0].strip():12} 比值 = {ratio:.10f}")
        except:
            print(f"  {name.split('~')[0].strip():12} 计算错误")